package com.pawelthiel.persistence.dao.implementation;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.PersistenceException;
import javax.persistence.Query;

import com.framework.persistence.jpa.AbstractGenericJpaDAO;
import com.framework.services.ServiceFacade;
import com.pawelthiel.persistence.dao.IDataAccessObject;
import com.pawelthiel.persistence.entity.AbstractEntity;
import com.pawelthiel.persistence.entity.Benutzerrolle;
import com.pawelthiel.persistence.entity.User;
import com.pawelthiel.persistence.mapper.EntityToTransferObjectMapper;
import com.pawelthiel.persistence.mapper.TransferObjectToEntityMapper;
import com.pawelthiel.persistence.to.AbstractTO;
import com.pawelthiel.persistence.to.BenutzerrolleTO;
import com.pawelthiel.persistence.to.UserTO;

public class BenutzerrolleDAO extends AbstractGenericJpaDAO<Benutzerrolle, Integer> implements IDataAccessObject<BenutzerrolleTO> {

	@Override
	public BenutzerrolleTO select(int pk) throws PersistenceException,
			com.framework.exceptions.PersistenceException {
		Benutzerrolle benutzerrolle = findByPrimaryKey(pk);
		BenutzerrolleTO benutzerrolleTO = EntityToTransferObjectMapper.mapBenutzerrolle(benutzerrolle);
		
		return benutzerrolleTO;
	}

	@Override
	public BenutzerrolleTO findByFilter(int userId) {
		BenutzerrolleTO benutzerrolleTO = new BenutzerrolleTO();
		Query query = createNativeQuery("select b from Benutzerrolle b inner join User u where b.user.id= " + userId);
		List<Benutzerrolle> resultList = query.getResultList();
		
		for(Benutzerrolle element : resultList) {
			benutzerrolleTO = EntityToTransferObjectMapper.mapBenutzerrolle(element);
		}
		
		return benutzerrolleTO;
	}

	@Override
	public BenutzerrolleTO findByFilter(String benutzerrollenBezeichnung) {
		BenutzerrolleTO benutzerrolleTO = new BenutzerrolleTO();
		Query query = createNativeQuery("select b from Benutzerrolle b inner join User u where b.bezeichnung= " + benutzerrollenBezeichnung);
		List<Benutzerrolle> resultList = query.getResultList();
		
		for(Benutzerrolle element : resultList) {
			benutzerrolleTO = EntityToTransferObjectMapper.mapBenutzerrolle(element);
		}
		
		return benutzerrolleTO;
	}

	@Override
	public Integer getPrimaryKey(AbstractEntity entity) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<BenutzerrolleTO> selectAll() {
		List<BenutzerrolleTO> benutzerrolleTOs = new ArrayList<BenutzerrolleTO>();
		Query query = createNativeQuery("select b from Benutzerrolle b");
		List<Benutzerrolle> resultList = query.getResultList();
		
		for(Benutzerrolle element : resultList) {
			benutzerrolleTOs.add(EntityToTransferObjectMapper.mapBenutzerrolle(element));
		}
		
		return benutzerrolleTOs;
	}

	@Override
	public void insert(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		BenutzerrolleTO benutzerrolleTO = (BenutzerrolleTO) to;
		List<UserTO> userTOs = benutzerrolleTO.getUsers();
		
		Benutzerrolle benutzerrolle = new Benutzerrolle();
		List<User> users = new ArrayList<User>();
		
		TransferObjectToEntityMapper.mapBenutzerrolle(benutzerrolle, benutzerrolleTO);
		
		if(userTOs != null) {
			IDataAccessObject<UserTO> userDao = ServiceFacade.getService(IDataAccessObject.class, "UserTO");
			for(UserTO element : userTOs) {
				User user = new User();
				UserTO userTO = userDao.findByFilter(element.getId());
				TransferObjectToEntityMapper.mapUser(user, userTO);
				users.add(user);
			}
		}
		
		benutzerrolle.setUsers(users);
		create(benutzerrolle);
	}

	@Override
	public void update(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void delete(AbstractTO to)
			throws com.framework.exceptions.PersistenceException {
		// TODO Auto-generated method stub
		
	}
}